<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 28.08.14
 * Time: 11:30
 */

namespace Messenger\Workers;

use Messenger\Groups;
use Messenger\Queue\Worker;
use Messenger\Relations;
use \Log;
use NotificationDelivery\Queue;
use Pinenut\Queue\ProcessingQueue;


class NewMessageAction extends Worker
{

	/**
	 * Создает уведомления для всех онлайн-собеседников группы о приходе нового сообщения
	 *
	 * @param ProcessingQueue $item - элемент очереди
	 * @return bool
	 */
	public function process(ProcessingQueue $item)
	{
		# Извлекаем из элемента очереди id группы переписки
		$groupId = (string)$item->data['groupId'];

		# Извлекаем из элемента очереди id профиля автора сообщения
		$author = (string)$item->data['authorId'];

		# Пытается загрузить модель группы переписки
		/** @var Groups $groupModel */
		$groupModel = Groups::find($groupId);

		# Если группа не найдена в бд - прекращаем обработку уведомления
		if ($groupModel === null) {
			\Log::msg('Группа "' . $groupId . '" не найдена в БД');
			return false;
		}

		# Формируем список получателей уведомления, удаляя из него автора сообщения
		unset ($groupModel->relations[$author]);
		$groupUserIds = [];
		foreach ($groupModel->relations as $userId => $relation) {
			$groupUserIds[] = $userId;
		}

		# Для каждого получателя формируем новое уведомление с типом "На отправку"
		foreach ($groupUserIds as $userId) {
			$relationStatus = $groupModel->relations[$userId]->status;
			# Признак того, что у получателя уведомления данная группа находится в списке заблокированных
			$item->data['isBlocked'] = (int)($relationStatus == Relations::STATUS_BLOCKED);

			if (!$item->data['isBlocked']) {
				$item->data['listStatus'] = $relationStatus;
			}

			# Добавляем в очередь новое уведомление
			Queue::enqueue(
				[
					'type' => \NotificationDeliveryConfig::TYPE_SEND_TO_RECEIVER,
					'subscriber' => $userId,
					'data' =>
						[
							'eventName' => 'messengerNewMessage',
							'eventData' => $item->data,
						],
				]
			);
		}

		return true;
	}
}